package com.itheima.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.itheima.constant.MessageConstant;
import com.itheima.dao.UserDao;
import com.itheima.entity.PageResult;
import com.itheima.pojo.User;
import com.itheima.service.UserService;
import com.itheima.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.transaction.annotation.Transactional;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 用户服务接口实现类
 * @author wangxin
 * @version 1.0
 */
@Service(interfaceClass = UserService.class)
@Transactional
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    /**
     * 根据用户名查询数据用户信息
     * @param username
     * @return
     */
    @Override
    public User findByUserName(String username) {
        return userDao.findByUserName(username);
    }
    /**
     * 查询所有的用户数据（分页查询）
     */
    @Override
    public PageResult findPage(Integer currentPage, Integer pageSize, String queryString) {
        // 1.设置分页参数
        PageHelper.startPage(currentPage, pageSize);
        // 2.调用dao查询数据库
        List<User> userList = userDao.queryByCondition(queryString);
        // 3.封装查询结果至PageInfo
        PageInfo<User> pageInfo = new PageInfo<>(userList);
        // 4.返回结果
        return new PageResult(pageInfo.getTotal(), pageInfo.getList());
    }
    /**
     * 新增用户
     */
    @Override
    public void add(User user, Integer[] roleIds) {
        // 密码进行Bcrypt加密处理
        String password = user.getPassword();
        BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
        password = encoder.encode(password);
        user.setPassword(password);
        // 新增用户
        userDao.add(user);
        // 调用方法，将用户与角色的关系插入中间表
        setUserAndRoleRelationship(user.getId(), roleIds);
    }
    /**
     * 根据id查询用户信息
     */
    @Override
    public User queryByUserId(Integer userId) {
        return userDao.queryByUserId(userId);
    }
    /**
     * 根据用户id查询用户关联的角色id数组
     */
    @Override
    public List<Integer> findRoleIdsByUserId(Integer userId) {
        return userDao.findRoleIdsByUserId(userId);
    }
    /**
     * 保存编辑后的用户数据
     */
    @Override
    public void edit(User user, Integer[] roleIds) {
        // 0.数据预处理
        // 0.1 比对编辑前后密码是否改变
        User originUser = userDao.queryByUserId(user.getId());
        String originPassword = originUser.getPassword();
        if (originPassword != null && originPassword.length() > 0) {
            //比较是否一致
            if (!originPassword.equals(user.getPassword())) {
                // 0.2 不一样，对编辑后的密码进行Bcrypt加密处理
                String password = user.getPassword();
                BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
                password = encoder.encode(password);
                user.setPassword(password);
            }
        }
        // 1.保存编辑后的用户数据
        userDao.edit(user);
        // 2.保存用户和角色的关联信息数据
        // 2.1 先删除用户关联的角色记录 （中间表）
        userDao.deleteUserAndRoleRelationship(user.getId());
        // 2.2 重新建立关联关系（插入中间表）
        setUserAndRoleRelationship(user.getId(), roleIds);
    }

    /**
     * 根据id删除用户数据
     */
    @Override
    public void deleteByUserId(Integer userId) {
        //业务角度考虑
        //查询用户和角色表关系是否存在，存在则无法删除
        int count = userDao.findUserAndRoleRelationship(userId);
        if(count>0){
            throw new RuntimeException(MessageConstant.ERROR_USER_ROLE_ASSOCIATIVE);//一定要install
        }
        //如果关系不存在，则可以删除
        userDao.deleteByUserId(userId);
    }


    /**
     * 往用户和角色中间表写记录(新增用户、编辑用户公共的代码)
     */
    private void setUserAndRoleRelationship(Integer userId, Integer[] roleIds) {
        if(roleIds != null && roleIds.length > 0){
            for (Integer roleId : roleIds) {
                //使用map对象传递参数
                Map<String,Integer> map = new HashMap<>();
                map.put("userId",userId);
                map.put("roleId",roleId);
                userDao.setCheckGroupAndCheckItem(map);
            }
        }
    }
}
